TypeScriptã®åã·ã¹ãã ããè匱æ§ãé²ããã³ãŒãå質ãåäžãããã°ããŒãã«ããŒã å šäœã®å®å šãªãœãããŠã§ã¢éçºãä¿é²ããããšã§ãã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã©ã®ããã«åŒ·åããããæ¢ããŸãã
TypeScriptã®ã»ãã¥ãªãã£ã¢ãŒããã¯ãã£ïŒä¿è·ã·ã¹ãã åå®å šæ§
é²åãç¶ãããœãããŠã§ã¢éçºã®ç¶æ³ã«ãããŠãã»ãã¥ãªãã£ã¯æãéèŠãªèŠçŽ ãšãªã£ãŠããŸããäžçäžã®éçºè ã¯ãå ç¢ã§å®å šãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå¿ èŠæ§ããŸããŸãèªèããŠããŸããJavaScriptã®ã¹ãŒããŒã»ããã§ããTypeScriptã¯ãã»ãã¥ãªãã£äžã®æžå¿µã«çŽæ¥å¯ŸåŠãã匷åãªæ©èœãæäŸããŸãããã®å ç¢ãªåã·ã¹ãã ã¯ããã®ã»ãã¥ãªãã£éèŠã®ã¢ãããŒãã®åºç€ã§ãããåå®å šæ§ãä¿é²ããæœåšçãªè匱æ§ã軜æžããŸãããã®èšäºã§ã¯ãTypeScriptã®åã·ã¹ãã ãããå®å šãªã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ã«ã©ã®ããã«è²¢ç®ããããæ¢ããŸãã
åå®å šæ§ã®éèŠæ§ãçè§£ãã
åå®å šæ§ã¯ãTypeScriptã®ã»ãã¥ãªãã£äžã®å©ç¹ã®èŠã§ããããã¯æ¬è³ªçã«ãã³ã³ãã€ã©ãã³ã³ãã€ã«æã«å€æ°ã®åã颿°ãã©ã¡ãŒã¿ãŒãããã³æ»ãå€ããã§ãã¯ããããšãæå³ããŸãããã®å å¶çãªåæã«ãããåã«é¢é£ãããšã©ãŒãå®è¡æåã«ææãããå®å šãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãã颿°ãæ°å€ãæåŸ ããŠããã®ã«æååãåãåãã·ããªãªãæ³åããŠãã ãããåå®å šæ§ããªãå Žåãããã¯äºæããªãåäœããšã©ãŒãããã³æœåšçãªã»ãã¥ãªãã£æªçšã«ã€ãªããå¯èœæ§ããããŸããTypeScriptã䜿çšãããšãã³ã³ãã€ã©ã¯éçºäžã«ãã®ãšã©ãŒãææããæ¬çªç°å¢ã«å°éããã®ãé²ããŸãã
åå®å šæ§ã¯ã³ãŒãã®äºæž¬å¯èœæ§ãé«ããŸããã³ã³ãã€ã©ãåå¶çŽã匷å¶ãããšãéçºè ã¯ã³ãŒããã©ã®ããã«åäœãããã«ã€ããŠèªä¿¡ãæã€ããšãã§ããŸãããã®äºæž¬å¯èœæ§ã®åäžã«ãããã»ãã¥ãªãã£è匱æ§ã«ã€ãªããããšãå€ãå®è¡æã®äºæãã¬äºæ ã®ãªã¹ã¯ã軜æžãããŸããããã¯ãããŒã ãç°ãªãã¿ã€ã ãŸãŒã³ã«ãŸããããçµéšã¬ãã«ãç°ãªããè€æ°ã®èšèªã§ã³ãã¥ãã±ãŒã·ã§ã³ããšãå¯èœæ§ãããã°ããŒãã«éçºç°å¢ã§ç¹ã«äŸ¡å€ããããŸããåå®å šæ§ã¯ã䜿çšããã人éèšèªã«é¢ä¿ãªããã³ã³ãã€ã©ãçè§£ããããã®å ±éèšèªãæäŸããŸãã
ã»ãã¥ãªãã£ã®ããã®TypeScriptåå®å šæ§ã®å©ç¹
1. åé¢é£ã®ãã°ã®é²æ¢
æãçŽæ¥çãªå©ç¹ã¯ãåé¢é£ã®ãã°ã®é²æ¢ã§ããTypeScriptã®åã·ã¹ãã ã¯ãéçºã©ã€ããµã€ã¯ã«ã®æ©ã段éã§æœåšçãªãšã©ãŒãç¹å®ããŸããããã«ã¯ãåäžäžèŽãäžæ£ç¢ºãªé¢æ°ãã©ã¡ãŒã¿ãŒã®äœ¿çšãããã³äºæããªãããŒã¿åãå«ãŸããŸãããããã®ãšã©ãŒãã³ã³ãã€ã«äžã«ææããããšã§ãéçºè ã¯ã»ãã¥ãªãã£è匱æ§ãéçšäžã®åé¡ã«ãªãåã«ä¿®æ£ã§ããŸããããšãã°ãäžæ£ãªå倿ã®ããã«ãŠãŒã¶ãŒå ¥åã誀ã£ãŠåŠçãããç¶æ³ãèããŠã¿ãŸããããTypeScriptã䜿çšãããšãæåŸ ãããå ¥ååãæç€ºçã«å®çŸ©ããã¢ããªã±ãŒã·ã§ã³ãããŒã¿ãæ£ããå®å šã«åŠçããããã«ã§ããŸããäŸãšããŠã¯ã財åããŒã¿ãåœéçãªäœæããŸãã¯ãŠãŒã¶ãŒè³æ Œæ å ±ã®åŠçãªã©ãæããããŸãããããã¯ãã¹ãŠãè匱æ§ãé²ãããã«å³å¯ãªåãã§ãã¯ãå¿ èŠãšããŸãã
äŸïŒ
TypeScriptãªãïŒ
function calculateDiscount(price, discountRate) {
return price * discountRate;
}
let price = '100'; // Oops, this is a string
let discount = 0.1;
let finalPrice = calculateDiscount(price, discount); // Runtime error (or unexpected result)
console.log(finalPrice);
TypeScriptããïŒ
function calculateDiscount(price: number, discountRate: number): number {
return price * discountRate;
}
let price: string = '100'; // TypeScript error: Type 'string' is not assignable to type 'number'
let discount: number = 0.1;
let finalPrice = calculateDiscount(price, discount); // Compilation error
console.log(finalPrice);
2. ã³ãŒãã®å¯èªæ§ãšä¿å®æ§ã®åäž
TypeScriptã®åã¢ãããŒã·ã§ã³ã¯ãã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžãããŸããåãæç€ºçã«å®çŸ©ãããŠããå Žåãéçºè ã¯é¢æ°ãã¡ãœãããããã³å€æ°ã®æåŸ ãããå ¥åãšåºåãç°¡åã«çè§£ã§ããŸãããã®æçãã«ãããã³ãŒããçè§£ããããã«å¿ èŠãªèªç¥è² è·ã軜æžãããæœåšçãªã»ãã¥ãªãã£åé¡ãç¹å®ããã³ãŒããé·æçã«ä¿å®ãããããªããŸããæç¢ºãªã³ãŒãã¯æ¬è³ªçã«å®å šã§ããé©åã«ææžåãããåå®å šãªã³ãŒãã¯ãä¿å®ãŸãã¯æŽæ°äžã«è匱æ§ãå°å ¥ããå¯èœæ§ãäœæžããŸããããã¯ã忣ããŒã ã«ãã£ãŠéçºãããå€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç¹ã«éèŠã§ããæç¢ºãªåã¢ãããŒã·ã§ã³ã¯ãæ°ããããŒã ã¡ã³ããŒãã³ãŒãããŒã¹ãè¿ éã«çè§£ããæœåšçãªã»ãã¥ãªãã£ãªã¹ã¯ãç¹å®ããã®ã«ã圹ç«ã¡ãŸãã
äŸïŒ
ã°ããŒãã«ãŠãŒã¶ãŒãããã¡ã€ã«ãªããžã§ã¯ãã®æ§é ãèããŠã¿ãŸãããïŒ
interface UserProfile {
id: number;
username: string;
email: string;
country: string; // e.g., 'US', 'GB', 'JP'
phoneNumber?: string; // Optional, use string for international formats
dateOfBirth?: Date; // Optional
address?: {
street: string;
city: string;
postalCode: string;
country: string; // Redundant, but shown for clarity
};
}
function updateUserProfile(user: UserProfile, updates: Partial): UserProfile {
// Implementation to update user profile based on updates
return { ...user, ...updates }; // Example: Simple merge with spread syntax
}
let existingUser: UserProfile = {
id: 123,
username: 'john.doe',
email: 'john.doe@example.com',
country: 'US',
phoneNumber: '+1-555-123-4567',
dateOfBirth: new Date('1990-01-15'),
address: {
street: '123 Main St',
city: 'Anytown',
postalCode: '12345',
country: 'US'
}
};
// Example Updates:
let updateProfile = {
username: 'john.doe.updated',
address: {
city: 'Springfield',
}
}
let updatedUser = updateUserProfile(existingUser, updateProfile);
console.log(updatedUser);
3. éçè§£æãšã³ãŒãã¬ãã¥ãŒã®ä¿é²
TypeScriptã®éçè§£ææ©èœã¯ãã³ãŒãã¬ãã¥ãŒãå€§å¹ ã«æ¯æŽããŸããã³ã³ãã€ã©ã¯ãã³ãŒããå®è¡ããã«åé¢é£ã®ãšã©ãŒãæœåšçãªãã°ãããã³ã³ãŒãã®åããç¹å®ã§ããŸãããã®éçè§£æã¯ããã«ãã€ã³ã¿äŸå€ãæªå®çŸ©å€æ°ã®äœ¿çšãäžæ£ãªããŒã¿å€æãªã©ã®è匱æ§ãæ¬çªç°å¢ã«å°éããåã«æ€åºã§ããŸããããã«ãéçè§£æããŒã«ã¯ã³ãŒãã¬ãã¥ãŒããã»ã¹ãšçµ±åããŠãäºåå®çŸ©ãããã»ãã¥ãªãã£ã«ãŒã«ãšã¬ã€ãã©ã€ã³ã«å¯ŸããŠã³ãŒããèªåçã«ãã§ãã¯ã§ããŸããåãšã©ãŒãèªåçã«ãã§ãã¯ããæ©èœã«ãããæåã³ãŒãã¬ãã¥ãŒã«è²»ããããæéãççž®ãããéçºè ã¯ããé«ã¬ãã«ã®ã»ãã¥ãªãã£åé¡ã«éäžã§ããŸããã°ããŒãã«ããŒã ã§ã¯ãããã«ããåã³ãŒãã¬ãã¥ãŒã«ãããæéãšåŽåãåæžãããå¹çãåäžããŸãã
äŸïŒ
éçè§£æããŒã«ïŒäŸïŒTypeScriptã«ãŒã«ã䜿çšããESLintïŒã䜿çšããŠãæªäœ¿çšå€æ°ãæœåšçãªnullåç §ãªã©ã®åé¡ãææããïŒ
// ESLint rule to flag unused variables:
let unusedVariable: string = 'This variable is unused'; // ESLint will flag this
// ESLint rule to prevent potentially null references:
let potentiallyNull: string | null = null;
// if (potentiallyNull.length > 0) { // ESLint would flag this, potential for runtime error
// }
4. APIã»ãã¥ãªãã£ãšã³ã³ãã©ã¯ãã®æ¹å
TypeScriptã®åã·ã¹ãã ã¯ãAPIã³ã³ãã©ã¯ãã®å®çŸ©ãšé©çšã«åªããŠããŸããAPIãåãå ¥ããè¿ãããŒã¿ã®åãæç€ºçã«å®çŸ©ããããšã§ãããŒã¿æŽåæ§ã確ä¿ããSQLã€ã³ãžã§ã¯ã·ã§ã³ãã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒæ»æãªã©ã®è匱æ§ãé²ãããšãã§ããŸããé©åã«åä»ããããAPIãšã³ããã€ã³ãã¯ãã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãšãµãŒããŒã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ã«å¯ŸããæåŸ ãæç¢ºã«ããŸããããã¯ãæ©å¯ããŒã¿ãåŠçããAPIãæ±ãå Žåã«ç¹ã«åœ¹ç«ã¡ãŸããã€ã³ã¿ãŒãã§ãŒã¹ãšåã䜿çšããŠããŒã¿æ§é ãå®çŸ©ããããšã§ãAPIãããå ç¢ã«ãªããã»ãã¥ãªãã£ãåäžããŸãããã®ã³ã³ãã©ã¯ãã¯ãäºæããªãããŒã¿åœ¢åŒãç¡å¹ãªå ¥åå€ããçããè匱æ§ãé²ãã®ã«åœ¹ç«ã¡ãŸããããã¯ãããŒã¿åœ¢åŒãå°åããšã®ããŒã¿åŠçã倧ããç°ãªãã°ããŒãã«äœ¿çšåãã«èšèšãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠäžå¯æ¬ ã§ãã
äŸïŒ
ãŠãŒã¶ãŒèªèšŒçšã®APIã³ã³ãã©ã¯ããå®çŸ©ããïŒ
interface AuthenticationRequest {
username: string;
password: string;
}
interface AuthenticationResponse {
success: boolean;
token?: string; // JWT token (optional)
error?: string;
}
async function authenticateUser(request: AuthenticationRequest): Promise {
// Validate input (e.g., username/password length, format)
if (request.username.length < 3 || request.password.length < 8) {
return { success: false, error: 'Invalid credentials' };
}
// Security note: Always hash passwords before storing/comparing them
// Example (using a hypothetical hashing function):
// const hashedPassword = await hashPassword(request.password);
// Authentication Logic (e.g., check against a database)
let isValid = true; // Placeholder, replace with actual authentication
if (isValid) {
const token = generateJwtToken(request.username); // Secure token generation
return { success: true, token };
} else {
return { success: false, error: 'Invalid credentials' };
}
}
5. å®å šãªãªãã¡ã¯ã¿ãªã³ã°ã®ä¿é²
ãªãã¡ã¯ã¿ãªã³ã°ã¯ãœãããŠã§ã¢éçºã®éèŠãªéšåã§ããã¢ããªã±ãŒã·ã§ã³ãæé·ããã«ã€ããŠãã³ãŒãã¯ä¿å®æ§ãšã¹ã±ãŒã©ããªãã£ã®ããã«åæ§ç¯ãããå¿ èŠããããŸããTypeScriptã®åã·ã¹ãã ã¯ããªãã¡ã¯ã¿ãªã³ã°äžã®ã»ãŒããã£ããããæäŸããŸããã³ãŒãã®æ§é ã倿Žãããšãã³ã³ãã€ã©ã¯ãããã®å€æŽãæ¢åã®ã³ãŒããç Žæããå¯èœæ§ã®ããé åãç¹å®ããŸããããã«ãããåäžäžèŽã誀ã£ã倿°äœ¿çšã«ãã£ãŠåŒãèµ·ããããæœåšçãªãšã©ãŒãã³ã³ãã€ã©ãææããããšãç¥ã£ãŠãèªä¿¡ãæã£ãŠãªãã¡ã¯ã¿ãªã³ã°ã§ããŸãããã®æ©èœã¯ã忣ããŒã ã«ãã£ãŠéçºãããå€§èŠæš¡ãªã³ãŒãããŒã¹ããªãã¡ã¯ã¿ãªã³ã°ããå Žåã«ç¹ã«äŸ¡å€ããããŸããåã·ã¹ãã ã¯ããªãã¡ã¯ã¿ãªã³ã°äœæ¥ãæ°ããªã»ãã¥ãªãã£è匱æ§ãå°å ¥ããªãããšãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸããã³ã³ãã€ã©ã¯ãã»ãã¥ãªãã£è匱æ§ã«ã€ãªããå¯èœæ§ã®ããç Žå£çãªå€æŽãé²ããŸãã
äŸïŒ
TypeScriptã䜿çšããããŒã¿ã¢ã¯ã»ã¹é¢æ°ã®ãªãã¡ã¯ã¿ãªã³ã°ïŒ
// Before Refactoring (less type safety)
function fetchData(url: string, callback: (data: any) => void) {
fetch(url)
.then(response => response.json())
.then(data => callback(data))
.catch(error => console.error('Error fetching data:', error));
}
// After Refactoring (more type safety)
interface UserData {
id: number;
name: string;
email: string;
}
function fetchDataTyped(url: string, callback: (data: UserData) => void) {
fetch(url)
.then(response => response.json())
.then((data: any) => {
// Type assertion if the response doesn't directly conform to UserData
// e.g., const userData: UserData = data as UserData;
// or more robust error handling
if (data && typeof data === 'object' && 'id' in data && 'name' in data && 'email' in data) {
callback(data as UserData);
} else {
console.error('Invalid data format received'); // Improved error handling
}
})
.catch(error => console.error('Error fetching data:', error));
}
// Usage Example:
fetchDataTyped('/api/users/1', (userData) => {
console.log('User data:', userData.name); // Type-safe access to userData properties
});
å®çšäŸãšãã¹ããã©ã¯ãã£ã¹
1. å ¥åæ€èšŒãšãµãã¿ã€ãº
å ¥åæ€èšŒã¯åºæ¬çãªã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ã§ããTypeScriptã¯ãã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãšé£æºããŠãéçºè ããŠãŒã¶ãŒå ¥åãå³å¯ã«æ€èšŒããã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒãSQLã€ã³ãžã§ã¯ã·ã§ã³ãªã©ã®ããŸããŸãªã»ãã¥ãªãã£è匱æ§ãé²ãããšãå¯èœã«ããŸããããŒã¿å ¥åã®æåŸ ãããåãšå¶çŽãå®çŸ©ããããšã§ãéçºè ã¯æªæã®ããå ¥åãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠåŠçããããªã¹ã¯ã軜æžã§ããŸããããã¯ãããŸããŸãªãœãŒã¹ããã®ããŒã¿ãšããåãããWebã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç¹ã«éèŠã§ããäŸãšããŠã¯ãé»åã¡ãŒã«ã¢ãã¬ã¹ãé»è©±çªå·ãããã³åœéçãªäœæåœ¢åŒã®æ€èšŒãå«ãŸããŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã«ã¬ã³ããªã³ã°ããããããŒã¿ããŒã¹ã¯ãšãªã§å®è¡ãããããåã«ãåžžã«ããŒã¿ããµãã¿ã€ãºããŠãã ãããæ€èšŒããã³ãµãã¿ã€ãºããã»ã¹ãèªååããããã«ãå°çšã®ã©ã€ãã©ãªãŸãã¯ãã¬ãŒã ã¯ãŒã¯ã®äœ¿çšãæ€èšããŠãã ããããããã®ããã»ã¹ã¯ãããã³ããšã³ãããããã¯ãšã³ããŸã§ãã¢ããªã±ãŒã·ã§ã³å šäœã«ããã£ãŠäžè²«ããŠé©çšãããã¹ãã§ãã
äŸïŒ
// Input validation example with a validation library like 'validator'
import validator from 'validator';
interface UserRegistration {
email: string;
password: string;
}
function validateRegistration(data: UserRegistration): boolean {
if (!validator.isEmail(data.email)) {
console.error('Invalid email address');
return false;
}
if (data.password.length < 8) {
console.error('Password must be at least 8 characters');
return false;
}
return true;
}
const registrationData: UserRegistration = {
email: 'invalid-email',
password: 'short'
};
if (validateRegistration(registrationData)) {
// Proceed with user registration
console.log('Registration data is valid');
}
2. æ©å¯ããŒã¿ã®å®å šãªåãæ±ã
TypeScriptã¯ãæ éãªã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ãšçµã¿åãããããšã§ãéçºè ããã¹ã¯ãŒããAPIããŒãå人æ å ±ãªã©ã®æ©å¯ããŒã¿ãå®å šã«åŠçããããšãå¯èœã«ããŸããããã«ã¯ã匷åãªæå·åã®äœ¿çšãæ©å¯ããŒã¿ã®å®å šãªä¿åãããã³ã³ãŒãå ã®æ©å¯ããŒã¿ã®é²åºã®æå°åãå«ãŸããŸããã¢ããªã±ãŒã·ã§ã³ã«æ©å¯æ å ±ãããŒãã³ãŒãããªãã§ãã ãããç°å¢å€æ°ã䜿çšããŠç§å¯éµãšAPIè³æ Œæ å ±ã管çããŠãã ãããæ©å¯ããŒã¿ãšãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå¶éããããã«ãé©åãªã¢ã¯ã»ã¹å¶åŸ¡ã¡ã«ããºã ãå®è£ ããŠãã ãããæœåšçãªæ©å¯ããŒã¿æŒæŽ©ããªãããã³ãŒãã宿çã«ç£æ»ããŠãã ãããã»ãã¥ãªãã£ã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ã掻çšããŠãã»ãã¥ãªãã£è匱æ§ã«å¯Ÿãã远å ã®ä¿è·ãæäŸããŠãã ããã
äŸïŒ
// Secure password storage with hashing (example, NOT production-ready)
import *s bcrypt from 'bcrypt'; // npm install bcrypt
async function hashPassword(password: string): Promise {
const saltRounds = 10; // Adjust salt rounds for security, must be >= 10
const salt = await bcrypt.genSalt(saltRounds);
const hashedPassword = await bcrypt.hash(password, salt);
return hashedPassword;
}
// Example of storing in an environment variable (Node.js)
// const apiKey = process.env.API_KEY || 'default-api-key'; // Use .env files with caution
// Example of protecting API keys and secrets:
// - Never commit API keys/secrets directly in source code.
// - Store API keys in environment variables (.env files - be cautious with those or configuration files, depending on the project setup)
// - Utilize secure secrets management services (e.g., AWS Secrets Manager, Azure Key Vault, Google Cloud Secret Manager).
3. é©åãªãšã©ãŒåŠçã®å®è£
å ç¢ãªãšã©ãŒåŠçã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£ãç¶æããæœåšçãªæªçšãé²ãããã«äžå¯æ¬ ã§ããTypeScriptã¯åã·ã¹ãã ã䜿çšããŠãšã©ãŒåŠçã容æã«ãããšã©ãŒã®ç®¡çãšè¿œè·¡ãç°¡çŽ åããŸãããã«ãã€ã³ã¿äŸå€ããããã¯ãŒã¯ãšã©ãŒãããŒã¿ããŒã¹æ¥ç¶ãšã©ãŒãªã©ã®äºæããªããšã©ãŒãææããã³åŠçããããã«ãé©åãªãšã©ãŒåŠçã¡ã«ããºã ãå®è£ ããŠãã ããããããã°ãæ¯æŽããæœåšçãªã»ãã¥ãªãã£è匱æ§ãç¹å®ããããã«ããšã©ãŒã广çã«ãã°ã«èšé²ããŠãã ããããšã©ãŒã¡ãã»ãŒãžã§æ©å¯æ å ±ãå ¬éããªãã§ãã ããããŠãŒã¶ãŒã«æçã§ããã詳现ãæãããªããšã©ãŒã¡ãã»ãŒãžãæäŸããŠãã ãããã¢ããªã±ãŒã·ã§ã³ã®ãšã©ãŒãç£èŠããã³åæããããã«ããšã©ãŒè¿œè·¡ãµãŒãã¹ãçµ±åããããšãæ€èšããŠãã ããã
äŸïŒ
// Proper error handling example
async function fetchData(url: string): Promise {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error: any) {
console.error('Error fetching data:', error);
// Log the error for debugging.
// example: logError(error, 'fetchData'); // (use a logging library)
// In production, avoid revealing details about underlying implementation details.
throw new Error('An error occurred while fetching data. Please try again later.'); // User-friendly error
}
}
// Example usage:
fetchData('/api/data')
.then(data => {
// Process data
console.log('Data:', data);
})
.catch(error => {
// Handle errors
console.error('Error in main flow:', error.message); // User-friendly message
});
4. éåææäœã®ä¿è·
éåææäœã¯ãçŸä»£ã®Webã¢ããªã±ãŒã·ã§ã³ã®åºç€ã§ããTypeScriptã¯ãPromiseãšasync/awaitæ§æã䜿çšããããšã§ãéåææäœã®ã»ãã¥ãªãã£ã確ä¿ããã®ã«åœ¹ç«ã¡ãŸããç«¶åç¶æ ããªãœãŒã¹ãªãŒã¯ãªã©ã®ã»ãã¥ãªãã£è匱æ§ãé²ãããã«ãéåææäœãé©åã«åŠçããŠãã ãããtry/catchãããã¯ãå©çšããŠãéåææäœã§ã®ãšã©ãŒãé©åã«åŠçããŠãã ãããæäœã®é åºãæ éã«æ€èšããæäœãå®äºãããšãã«å¿ èŠãªãã¹ãŠã®ãªãœãŒã¹ãè§£æŸãããããšã確èªããŠãã ãããäžŠè¡æäœãæ±ãéã«ã¯æ³šæããããŒã¿ã®ç Žæãé²ãããã«é©åãªããã¯ã¡ã«ããºã ãé©çšããŠãã ãããããã¯ãAPIåŒã³åºããããŒã¿ããŒã¹æäœãããã³åæçã«å®è¡ãããªããã®ä»ã®æäœãªã©ã®é¢æ°ã«é©çšãããŸãã
äŸïŒ
// Securing asynchronous operations with async/await and try/catch
async function processData(data: any) {
try {
// Simulate an async operation (e.g., database write)
await new Promise(resolve => setTimeout(resolve, 1000)); // Simulate a delay
console.log('Data processed:', data);
} catch (error) {
// Handle errors that occur during the asynchronous operation.
console.error('Error processing data:', error);
// Implement retry logic or alert the user, logging is crucial.
} finally {
// Perform cleanup actions, like closing database connections
// always implement the finally block to ensure consistent state
console.log('Cleanup actions');
}
}
// Example of data processing
processData({ message: 'Hello, World!' });
5. TypeScriptã®é«åºŠãªæ©èœã®æŽ»çš
TypeScriptã¯ããžã§ããªãã¯ããããã³ã°åããã³ã¬ãŒã¿ãªã©ã®é«åºŠãªæ©èœãæäŸããã»ãã¥ãªãã£ã匷åããŸãããžã§ããªãã¯ã掻çšããŠåå®å šã§åå©çšå¯èœãªã³ã³ããŒãã³ããäœæããŠãã ããããããã³ã°åã䜿çšããŠæ¢åã®åã倿ããç¹å®ã®ããŒã¿æ§é ã匷å¶ããŠãã ããããã³ã¬ãŒã¿ã䜿çšããŠã¡ã¿ããŒã¿ã远å ããã¯ã©ã¹ãã¡ãœãããããããã£ã®åäœã倿ŽããŠãã ããããããã®æ©èœã¯ãã³ãŒãå質ã®åäžãã»ãã¥ãªãã£ããªã·ãŒã®é©çšãããã³è匱æ§ã®ãªã¹ã¯ã®è»œæžã«åœ¹ç«ã¡ãŸãããããã®æ©èœã䜿çšããŠãã³ãŒãæ§é ãšã»ãã¥ãªãã£ãããã³ã«ã匷åããŠãã ããã
äŸïŒ
// Using generics for type safety in a data repository
interface DataRepository {
getData(id: number): Promise;
createData(item: T): Promise;
updateData(id: number, item: Partial): Promise; // allow partial updates
deleteData(id: number): Promise;
}
// Example: User Repository
interface User {
id: number;
name: string;
email: string;
}
class UserRepository implements DataRepository {
// Implementation details for data access (e.g., database calls)
async getData(id: number): Promise {
// ... (Retrieve user data)
return undefined; // Replace with an implementation
}
async createData(item: User): Promise {
// ... (Create a new user)
return item;
}
async updateData(id: number, item: Partial): Promise {
// ... (Update user)
return undefined;
}
async deleteData(id: number): Promise {
// ... (Delete user)
return false;
}
}
// Usage Example:
const userRepository = new UserRepository();
userRepository.getData(123).then(user => {
if (user) {
console.log('User data:', user);
}
});
TypeScriptãéçºã¯ãŒã¯ãããŒã«çµ±åãã
1. å®å šãªéçºç°å¢ã®ã»ããã¢ãã
ã»ãã¥ãªãã£ã®ããã«TypeScriptã广çã«æŽ»çšããã«ã¯ãå®å šãªéçºç°å¢ãã»ããã¢ããããããšãäžå¯æ¬ ã§ããããã«ã¯ãå®å šãªã³ãŒããšãã£ã¿ãŸãã¯IDEã®äœ¿çšãããŒãžã§ã³ç®¡çã®æ¡çšãããã³é©åãªTypeScriptã³ã³ãã€ã©ãªãã·ã§ã³ã䜿çšãããããžã§ã¯ãã®æ§æãå«ãŸããŸããnpmãyarnãªã©ã®ããã±ãŒãžãããŒãžã£ã䜿çšããŠããããžã§ã¯ãã«TypeScriptãã€ã³ã¹ããŒã«ããŠãã ãããå³å¯ãªåãã§ãã¯ããã®ä»ã®ã»ãã¥ãªãã£éèŠã®æ©èœãæå¹ã«ããããã«ã`tsconfig.json`ãã¡ã€ã«ãæ§æããŠãã ããããªã³ã¿ãŒãéçã¢ãã©ã€ã¶ãŒãè匱æ§ã¹ãã£ããŒãªã©ã®ã»ãã¥ãªãã£ãã¹ãããŒã«ãéçºã¯ãŒã¯ãããŒã«çµ±åããŠãã ãããã»ãã¥ãªãã£è匱æ§ããä¿è·ããããã«ãéçºç°å¢ãšäŸåé¢ä¿ã宿çã«æŽæ°ããŠãã ãããã¢ããªã±ãŒã·ã§ã³ã«åœ±é¿ãäžããå¯èœæ§ã®ããè匱æ§ã®ãªã¹ã¯ãæå°éã«æããããã«ãéçºç°å¢ãä¿è·ããŠãã ãããã³ãŒãå質ãã§ãã¯ããã«ãããã»ã¹ãã»ãã¥ãªãã£ãã¹ããèªååããããã«ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒããã³ç¶ç¶çãããã€ã¡ã³ãïŒCDïŒãã€ãã©ã€ã³ãã»ããã¢ããããŠãã ãããããã«ãããã»ãã¥ãªãã£ãã§ãã¯ããã¹ãŠã®ã³ãŒãã³ãããã«äžè²«ããŠé©çšãããããšãä¿èšŒãããŸãã
äŸ (tsconfig.json):
{
"compilerOptions": {
"target": "ES2020", // Or a later version
"module": "CommonJS", // Or "ESNext", depending on your project
"strict": true, // Enable strict type checking
"esModuleInterop": true,
"skipLibCheck": true, // Skip type checking of declaration files (.d.ts) for libraries to improve compilation time
"forceConsistentCasingInFileNames": true, // For case sensitivity across file systems
"noImplicitAny": true, // More strict control of the any type
"noImplicitThis": true, // For this context errors
"strictNullChecks": true, // Requires null and undefined to be handled explicitly.
"strictFunctionTypes": true,
"strictBindCallApply": true,
"baseUrl": ".",
"paths": { // Configure module resolution paths (optional)
"*": ["./src/*"]
}
},
"include": ["src/**/*"]
}
2. ãªã³ã¿ãŒãšéçè§£æããŒã«ã®äœ¿çš
ã³ãŒãå ã®æœåšçãªã»ãã¥ãªãã£è匱æ§ãç¹å®ããããã«ããªã³ã¿ãŒãšéçè§£æããŒã«ãçµ±åããŠãã ãããTypeScriptãããžã§ã¯ãã¯ã`@typescript-eslint/eslint-plugin`ããã±ãŒãžãšãšãã«ESLintã®ãããªããŒã«ã䜿çšããããšã§ããã°ãã°å©çãåŸãŸãããããã®ããŒã«ãæ§æããŠãã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ã匷å¶ããè匱æ§ã瀺ãå¯èœæ§ã®ããã³ãŒãã®åããæ€åºããŠãã ãããéçºã¯ãŒã¯ãããŒã®äžéšãšããŠããªã³ã¿ãŒãšéçè§£æããŒã«ã宿çã«å®è¡ããŠãã ãããã³ãŒããèšè¿°ããéã«å³åº§ã«ãã£ãŒãããã¯ãæäŸããããã«ãIDEãŸãã¯ã³ãŒããšãã£ã¿ãæ§æããŠãããã®ããŒã«ãèªåçã«å®è¡ããŠãã ãããã³ãŒããæ¬çªç°å¢ã«ãããã€ãããåã«ãCI/CDãã€ãã©ã€ã³ã«ãªã³ãã£ã³ã°ãšéçè§£æãã§ãã¯ãå«ãŸããŠããããšã確èªããŠãã ããã
äŸ (ESLint Configuration):
// .eslintrc.js (example)
module.exports = {
parser: '@typescript-eslint/parser',
extends: [
'plugin:@typescript-eslint/recommended', // Includes TypeScript-specific rules
'prettier',
'plugin:prettier/recommended' // Integrates with Prettier for code formatting
],
plugins: [
'@typescript-eslint'
],
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module'
},
rules: {
// Security-related rules:
'@typescript-eslint/no-explicit-any': 'warn', // Prevents the use of 'any' (can be too permissive)
'@typescript-eslint/no-unused-vars': 'warn', // Checks for unused variables, including local and global, preventing potential vulnerabilities.
'no-console': 'warn', // Prevents unintentional use of console.log/debug statements in production code.
'@typescript-eslint/no-floating-promises': 'error', // Prevents potential promise leaks
// ... other rules specific to your project
}
};
3. ã³ãŒãã¬ãã¥ãŒãšã»ãã¥ãªãã£ç£æ»
ã³ãŒãã¬ãã¥ãŒãšã»ãã¥ãªãã£ç£æ»ã¯ãå®å šãªãœãããŠã§ã¢éçºã©ã€ããµã€ã¯ã«ã®éèŠãªèŠçŽ ã§ããã³ãŒã倿Žãã¡ã€ã³ãã©ã³ãã«ããŒãžãããåã«ãã³ãŒã倿Žã培åºçã«ã¬ãã¥ãŒããããã®ã³ãŒãã¬ãã¥ãŒããã»ã¹ãå®è£ ããŠãã ãããã»ãã¥ãªãã£å°éå®¶ãå·»ã蟌ã¿ãã¢ããªã±ãŒã·ã§ã³ã®å®æçãªã»ãã¥ãªãã£ç£æ»ãšäŸµå ¥ãã¹ãã宿œããŠãã ãããã³ãŒãã¬ãã¥ãŒäžã¯ãæ©å¯ããŒã¿ããŠãŒã¶ãŒèªèšŒãããã³å ¥åæ€èšŒãåŠçããã³ãŒãé åã«ç¹ã«æ³šæãæã£ãŠãã ãããã³ãŒãã¬ãã¥ãŒãšã»ãã¥ãªãã£ç£æ»äžã«ç¹å®ããããã¹ãŠã®ã»ãã¥ãªãã£è匱æ§ãšãã®çµæã«å¯ŸåŠããŠãã ãããéçè§£æããŒã«ãè匱æ§ã¹ãã£ããŒãªã©ã®èªååããŒã«ã䜿çšããŠãã³ãŒãã¬ãã¥ãŒãšã»ãã¥ãªãã£ç£æ»ãæ¯æŽããŠãã ãããéçºããŒã ãææ°ã®ã»ãã¥ãªãã£è åšãšãã¹ããã©ã¯ãã£ã¹ãèªèããŠããããšã確èªããããã«ãã»ãã¥ãªãã£ããªã·ãŒãæé ãããã³ãã¬ãŒãã³ã°ããã°ã©ã ã宿çã«æŽæ°ããŠãã ããã
4. ç¶ç¶çãªç£èŠãšè åšæ€åº
ã»ãã¥ãªãã£è åšããªã¢ã«ã¿ã€ã ã§ç¹å®ãã察å¿ããããã«ãç¶ç¶çãªç£èŠããã³è åšæ€åºã¡ã«ããºã ãå®è£ ããŠãã ããããã®ã³ã°ããã³ç£èŠããŒã«ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®åäœã远跡ããç°åžžãæ€åºããæœåšçãªã»ãã¥ãªãã£ã€ã³ã·ãã³ããç¹å®ããŠãã ãããã»ãã¥ãªãã£ããŒã ã«çãããã¢ã¯ãã£ããã£ãã»ãã¥ãªãã£äŸµå®³ãéç¥ããããã«ã¢ã©ãŒããèšå®ããŠãã ãããã»ãã¥ãªãã£ã€ãã³ããšæœåšçãªè匱æ§ããªãããã°ã宿çã«åæããŠãã ãããé²åããã»ãã¥ãªãã£è åšã«é©å¿ããããã«ãè åšæ€åºã«ãŒã«ãšã»ãã¥ãªãã£ããªã·ãŒãç¶ç¶çã«æŽæ°ããŠãã ãããã»ãã¥ãªãã£è匱æ§ãç¹å®ãã察åŠããããã«ãã»ãã¥ãªãã£è©äŸ¡ãšäŸµå ¥ãã¹ãã宿çã«å®æœããŠãã ãããã»ãã¥ãªãã£ã€ãã³ããé¢é£ä»ããã»ãã¥ãªãã£æ å¢ã®éäžãã¥ãŒãæäŸããããã«ãã»ãã¥ãªãã£æ å ±ããã³ã€ãã³ã管çïŒSIEMïŒã·ã¹ãã ã®äœ¿çšãæ€èšããŠãã ããããã®ç¶ç¶çãªç£èŠã¢ãããŒãã¯ãæ°ããªè åšã«å¯Ÿå¿ããã°ããŒãã«ãªç¶æ³ã§ã¢ããªã±ãŒã·ã§ã³ãä¿è·ããããã«äžå¯æ¬ ã§ãã
ã°ããŒãã«ãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
1. ããŒã«ãªãŒãŒã·ã§ã³ãšåœéå
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®ã¢ããªã±ãŒã·ã§ã³ãéçºããå ŽåãããŒã«ãªãŒãŒã·ã§ã³ãšåœéåã¯éèŠãªèæ ®äºé ã§ããã¢ããªã±ãŒã·ã§ã³ãç°ãªãèšèªãæåãå°åèšå®ããµããŒãããŠããããšã確èªããŠãã ãããç°ãªãæ¥ä»ãšæå»ã®åœ¢åŒãé貚ã®åœ¢åŒãæåãšã³ã³ãŒãã£ã³ã°ãé©åã«åŠçããŠãã ãããæååãããŒãã³ãŒãã£ã³ã°ããããšãé¿ãããªãœãŒã¹ãã¡ã€ã«ã䜿çšããŠç¿»èš³å¯èœãªããã¹ãã管çããŠãã ãããåœéåïŒi18nïŒãšããŒã«ãªãŒãŒã·ã§ã³ïŒl10nïŒã¯èšèªã ãã®åé¡ã§ã¯ãããŸãããå°åã®æ³åŸãããŒã¿ãã©ã€ãã·ãŒèŠå¶ïŒäŸïŒãšãŒãããã®GDPRãã«ãªãã©ã«ãã¢ã®CCPAïŒãããã³æåçãã¥ã¢ã³ã¹ã«é¢ããèæ ®äºé ãå«ãŸããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ãç°ãªãåœã§ããŒã¿ãåŠçããæ¹æ³ã«ãé©çšãããŸãã
äŸïŒ
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®éè²šãšæ°å€ã®æžåŒèšå®ïŒ
// Using internationalization libraries like 'Intl' API in Javascript
// Example: Displaying currency
const amount = 1234.56;
const options: Intl.NumberFormatOptions = {
style: 'currency',
currency: 'USD'
};
const formatter = new Intl.NumberFormat('en-US', options);
const formattedUSD = formatter.format(amount); // $1,234.56
const optionsJPY: Intl.NumberFormatOptions = {
style: 'currency',
currency: 'JPY'
};
const formatterJPY = new Intl.NumberFormat('ja-JP', optionsJPY);
const formattedJPY = formatterJPY.format(amount); // ¥1,235
2. ããŒã¿ãã©ã€ãã·ãŒãšã³ã³ãã©ã€ã¢ã³ã¹
ããŒã¿ãã©ã€ãã·ãŒãšã³ã³ãã©ã€ã¢ã³ã¹ã¯ããŠãŒã¶ãŒãšã®ä¿¡é Œãç¯ããã°ããŒãã«èŠå¶ãéµå®ããããã«äžå¯æ¬ ã§ããGDPRãCCPAãããã³ãã®ä»ã®å°åã®æ³åŸãªã©ãé¢é£ããããŒã¿ãã©ã€ãã·ãŒèŠå¶ãéµå®ããŠãã ãããããŒã¿æå·åãã¢ã¯ã»ã¹å¶åŸ¡ãããŒã¿ä¿æããªã·ãŒãªã©ã®é©åãªããŒã¿ãã©ã€ãã·ãŒå¶åŸ¡ãå®è£ ããŠãã ãããããŒã¿åéãšåŠçã®ããã«ãŠãŒã¶ãŒã®åæãåŸãŠããŠãŒã¶ãŒãå人ããŒã¿ã«ã¢ã¯ã»ã¹ã倿Žãåé€ãããªãã·ã§ã³ãæäŸããŠãã ãããå人æ å ±ã財åããŒã¿ãå¥åº·æ å ±ãªã©ã®æ©å¯ãŠãŒã¶ãŒããŒã¿ãé©åã«åŠçããã³ä¿è·ããŠãã ãããããã¯ãäžçã§æã峿 ŒãªããŒã¿ãã©ã€ãã·ãŒèŠå¶ã®äžéšïŒGDPRïŒãæã€æ¬§å·é£åïŒEUïŒã®ãŠãŒã¶ãŒãæ±ãå Žåã«ç¹ã«éèŠã§ãã
äŸïŒ
GDPRã«æºæ ããã«ã¯ããŠãŒã¶ãŒã®åæãåŸãŠãæç¢ºãªãã©ã€ãã·ãŒéç¥ãæäŸããããŒã¿æå°åã®ååãéµå®ããå¿ èŠããããŸãïŒ
// Example: obtaining user consent (simplistic)
interface UserConsent {
marketingEmails: boolean;
dataAnalytics: boolean;
}
function getUserConsent(): UserConsent {
// Implementation to obtain user preferences
// Typically, present a user interface (e.g., a checkbox form).
return {
marketingEmails: true, // Assume the user consents by default for this example
dataAnalytics: false // assume user doesn't opt-in for analytics
};
}
function processUserData(consent: UserConsent, userData: any) {
if (consent.marketingEmails) {
// Send marketing emails based on consent.
console.log('Sending marketing emails', userData);
}
if (consent.dataAnalytics) {
// Process data analytics.
console.log('Analyzing user data', userData);
} else {
// Avoid analytics processing, implement data minimization
console.log('Skipping analytics (no consent)');
}
}
3. ã¢ã¯ã»ã¹å¶åŸ¡ãšèªèšŒ
æ©å¯ãªãœãŒã¹ãšããŒã¿ãäžæ£ã¢ã¯ã»ã¹ããä¿è·ããããã«ãå ç¢ãªã¢ã¯ã»ã¹å¶åŸ¡ã¡ã«ããºã ãå®è£ ããŠãã ãããå€èŠçŽ èªèšŒïŒMFAïŒããã¹ã¯ãŒãããªã·ãŒãªã©ã®åŒ·åãªèªèšŒæ¹æ³ãå©çšããŠãã ããããŠãŒã¶ãŒã®æš©éã管çãããŠãŒã¶ãŒãå¿ èŠãªãªãœãŒã¹ã®ã¿ã«ã¢ã¯ã»ã¹ã§ããããã«ããããã«ãããŒã«ããŒã¹ã®ã¢ã¯ã»ã¹å¶åŸ¡ïŒRBACïŒãå®è£ ããŠãã ãããå€åããã»ãã¥ãªãã£èŠä»¶ãåæ ããããã«ãã¢ã¯ã»ã¹å¶åŸ¡ããªã·ãŒã宿çã«èŠçŽããæŽæ°ããŠãã ãããäºæ¥ãå±éããåœã«åºã¥ããŠããŠãŒã¶ãŒèªèšŒãšããŒã¿ã¢ã¯ã»ã¹ã«é¢ããç°ãªãæ³çèŠä»¶ã«çæããŠãã ãããããšãã°ãäžéšã®åœã§ã¯éèååŒã«äºèŠçŽ èªèšŒãèŠæ±ããå ŽåããããŸãã
4. ã»ãã¥ãªãã£ãã¬ãŒãã³ã°ãšæèåäž
éçºããŒã ããã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ãTypeScriptã®ã»ãã¥ãªãã£æ©èœãããã³é¢é£ããã°ããŒãã«èŠå¶ã«ã€ããŠå®æçã«ãã¬ãŒãã³ã°ããŠãã ããããã¹ãŠã®åŸæ¥å¡ã«ã»ãã¥ãªãã£æèåäžãã¬ãŒãã³ã°ãæäŸããæœåšçãªã»ãã¥ãªãã£è åšãšãªã¹ã¯ã«ã€ããŠæè²ããŠãã ãããè匱æ§ãç¹å®ãã察åŠããããã«ã宿çãªã»ãã¥ãªãã£ç£æ»ãšäŸµå ¥ãã¹ãã宿œããŠãã ãããçµç¹å ã§ã»ãã¥ãªãã£æèã®é«ãæåãä¿é²ãããœãããŠã§ã¢éçºã©ã€ããµã€ã¯ã«ã®ãã¹ãŠã®æ®µéã§ã»ãã¥ãªãã£ã®éèŠæ§ã匷調ããŠãã ãããã»ãã¥ãªãã£ãã¬ãŒãã³ã°ãç°ãªãæåçããã³æè²çèæ¯ã«é©å¿ãããå¿ èŠæ§ãèªèããŠãã ãããç°ãªãæåã¯ã»ãã¥ãªãã£ãªã¹ã¯ã«å¯Ÿããæèã¬ãã«ãç°ãªããããã«å¿ããŠãã¬ãŒãã³ã°ã調æŽããå¿ èŠããããŸãããã¬ãŒãã³ã°ã¯ããã£ãã·ã³ã°è©æ¬ºããœãŒã·ã£ã«ãšã³ãžãã¢ãªã³ã°æè¡ãäžè¬çãªã»ãã¥ãªãã£è匱æ§ãªã©ãããŸããŸãªåŽé¢ãã«ããŒããå¿ èŠããããŸãã
çµè«
TypeScriptã®åã·ã¹ãã ã¯ãå®å šã§ä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªããŒã«ã§ããåå®å šæ§ã匷åãªåä»ããéçè§£æãªã©ã®æ©èœã掻çšããããšã§ãéçºè ã¯ã³ãŒãã«ã»ãã¥ãªãã£è匱æ§ãå°å ¥ãããªã¹ã¯ãå€§å¹ ã«åæžã§ããŸããããããTypeScriptãäžèœè¬ã§ã¯ãªãããšãèŠããŠããããšãéèŠã§ããçã«å®å šãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ãå®å šãªã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ãã°ããŒãã«èŠå¶ãžã®æ éãªé æ ®ãããã³å ç¢ãªã»ãã¥ãªãã£ã¢ãŒããã¯ãã£ãšçµã¿åãããå¿ èŠããããŸãããã®èšäºã§æŠèª¬ãããŠãããã¹ããã©ã¯ãã£ã¹ããç¶ç¶çãªç£èŠãšæ¹åãšçµã¿åãããŠå®è£ ããããšã§ãTypeScriptãæŽ»çšããŠãã°ããŒãã«ãªããžã¿ã«ç°å¢ã®èª²é¡ã«èããããããå®å šã§ä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããã»ãã¥ãªãã£ã¯ç¶ç¶çãªããã»ã¹ã§ãããTypeScriptãæäŸããä¿è·ã¯ä»ã®ã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ãè£å®ããããšãå¿ããªãã§ãã ããã